Reference
- 문제 출처 - HackerRank
- 파이썬 연습 - Practice - Python
개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다
HackerRank
Subdomain
- ~~Introduction~~
- ~~Basic Data Types~~
- ~~Strings~~
- ~~Sets~~
- ~~Math~~
- <strong style="color:blue">Itertools</strong>
- Collections
- Date and Time
- Errors and Exceptions
- Classes
- Built-Ins
- Python Functionals
- Regex and Parsing
- XML
- Closures and Decorators
- Numpy
- Debugging
Itertools
itertools.product()
문제 : A, B의 곱집합을 구하는 문제
입력 : A의 원소들; B의 원소들;
출력 : product(A, B)
|
from itertools import product |
itertools.permutations()
문제 : 문자열 S가 주어졌을 때 k의 크기로 뽑을 수 있는 순열(permutation)을 사전순(lexicographic order)으로 출력하는 문제
입력 : S, k; (문자열은 모두 대문자)
출력 : S로 만들 수 있는 순열을 한줄씩 출력
|
from itertools import permutations |
itertools.combinations()
문제 : 문자열 S가 주어졌을 때 k의 크기로 뽑을 수 있는 조합(combination)을 사전순으로 출력하는 문제
입력 : S, k; (문자열은 모두 대문자)
출력 : S로 만들 수 있는 서로 다른 조합을 한줄씩 출력
|
from itertools import combinations |
itertools.combinations_with_replacement()
문제 : 문자열 S가 주어졌을 때 k의 크기로 뽑을 수 있는 중복조합(combinations with replacement)을 사전순으로 출력하는 문제
입력 : S, k; (문자열은 모두 대문자)
출력 : S로 만들 수 있는 중복조합을 한줄씩 출력
|
from itertools import combinations_with_replacement |
Compress the String!
문제 : 문자열 S가 주어졌을 때 같은 문자끼리 그룹으로 묶어서 압축된 표현을 출력하는 문제
입력 : 문자열 S (숫자 0에서 9까지로 구성됨)
출력 : 문자를 c로 연속으로 출현한 횟수를 X라고 했을 때 (X, c)로 표현
파이썬의 goupby()
함수는 SQL의 개념과 조금 달라서 주의해야겠다.
만약 SQL의 그룹방식을 구현하고 싶다면 함수를 사용하기 전 정렬을 시켜주면 된다.
from itertools import groupby |
Iterables and Iterators
문제 : N개의 영문자 중에서 K개로 만들 수 있는 조합들 중에 ‘a’를 포함하는 조합을 확률로 출력하는 문제
입력 : 문자수 N; (N개의) 문자들; 조합 크기 K;
출력 : 확률을 소수점 3번째 자리까지 표현
combinations()
함수를 사용하여 전체 경우의 수를 구하고 문자 ‘a’가 있는 조합의 수를 구함list()
와 []
의 차이점을 주의 - difference btw list() and []
import itertools as it
N, letters, K = input(), input().split(), int(input())
c_letters = list(it.combinations(letters, K))
contain = [c for c in c_letters if 'a' in c]
print('{:.4f}'.format(len(contain)/len(c_letters)))
math 모듈을 사용해서 직접 수학적인 계산을 사용한 경우도 있음
from math import factorial |
수행시간을 비교해보면 그 차이가 매우 사소하기 때문에 combinations()
함수를 사용하는게 직관적으로 보기 좋은 것 같음
import itertools as it |
Maximize It!
문제 : f(x) = x^2 이고, S = (f(x1) + f(x2) + …) % M 일 때, 가장 큰 S를 구하는 문제
입력 : K, M; (K번 반복) 리스트의 크기, 숫자들…;
출력(예제) : 각 리스트에서 5, 9, 10을 뽑은 경우 (5^2 + 9^2 + 10^2)%1000 = 206으로 가장 크다
처음에 문제를 잘못 이해하고 각 리스트에서 가장 큰 수를 뽑아서 S를 구하는 문제인줄 알았다…
K, M = map(int, input().split()) |
각 리스트를 곱하여(product) 모든 조합을 만들고, 람다식을 이용해 각 조합의 S를 계산하여 최대값을 구한다.
from itertools import product |